/* 
 * File:   main.cpp
 * Author: Maximiliano Monzon (82341)
 *
 * Created on October 19, 2012, 9:30 PM
 */

#include <cstdlib>
#include <sstream>
#include "server_Servidor.h"
#include "common_Excepcion.h"

using namespace std;
using namespace TP;
using namespace TP::Comunicacion;

#define VALOR_RETORNO_DEFECTO 0

Servidor* crearServidor (const char* pNumeroPuerto, const char* pRutaArchivoEncriptado, const char* pLongitudClave, const char* pCantidadMaximaClientes) throw (Excepcion&);

int main(int argc, char** argv) {
    
    if (argc == 5)
    {
        Servidor *servidor = NULL;
        
        try
        {
            // Instancio e inicio el servidor.
            //
            servidor = crearServidor(argv[1], argv[2], argv[3], argv[4]);
            servidor->Iniciar();
            
            // Atiendo a los eventos provenientes de entrada estandar.
            //
            string comando = "";

            while (std::getline(cin, comando, '\n'))
            {
                if ("q" == comando)
                    break;
                else
                    cout << endl << "Comando invalido..." << endl << endl << "Salir (q): ";;
            }
            
        }
        catch (Excepcion& pEx)
        {
            cerr << pEx.what() << std::endl;
        } 
        
        // Libero los recursos ocupado por el servidor.
        //
        if (NULL != servidor)
        {
            try
            {
                servidor->Finalizar();
            }
            catch (Excepcion& ex)
            {
                cerr << ex.what() << endl;
            }
            delete servidor;
        }
    }
    else
        cout 
        << "Argumentos invalidos.  Intente ./" 
        << argv[0] 
        << " <puerto> <archivo_encriptado> <num_digitos_clave> <num_clientes>" 
        << endl;
    
    return VALOR_RETORNO_DEFECTO;
}

Servidor* crearServidor (const char* pNumeroPuerto, const char* pRutaArchivoEncriptado, const char* pLongitudClave, const char* pCantidadMaximaClientes) throw (Excepcion&){

    int longitudClave;
    std::stringstream ss_aux (pLongitudClave);
    ss_aux >> longitudClave;

    int cantidadMaximaClientes;
    ss_aux.clear();
    ss_aux.str(pCantidadMaximaClientes);
    ss_aux >> cantidadMaximaClientes;

    return new Servidor(pNumeroPuerto, pRutaArchivoEncriptado, longitudClave, cantidadMaximaClientes);

}

